// no copyable
#define NO_COPYABLE(TypeName)          \
 public:                               \
  TypeName(const TypeName &) = delete; \
  TypeName &operator=(const TypeName &) = delete;

// no moveable
#define NO_MOVEABLE(TypeName)     \
 public:                          \
  TypeName(TypeName &&) = delete; \
  TypeName &operator=(TypeName &&) = delete;